package com.nts.visionworks.core.multipart.service;

import javax.annotation.Resource;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.nts.visionworks.core.multipart.controller.MultipartController;
import com.nts.visionworks.core.multipart.domain.Archive;

/**
 * 멀티파트 아카이브를 위한 영속성 서비스다.
 * @author Devcken
 */
@Service("multipartService")
@Transactional
public class MultipartService
{
	private static final Logger logger = LoggerFactory.getLogger(MultipartController.class);
	
	@Resource(name="visionworksSessionFactory")
	private SessionFactory _sessionFactory;
	
	/**
	 * 아카이브 인스턴스를 데이터베이스에 저장한다.
	 * @param archive 저장하려는 아카이브 인스턴스를 나타낸다.
	 * @return true 인 경우 저장에 성공한 경우이고, false 인 경우 저장에 실패한 경우이다.
	 */
	public boolean saveArchive(Archive archive)
	{
		Long archiveId = 0L;
		
		Session session = this._sessionFactory.openSession();
		
		Transaction transaction = session.beginTransaction();
		
		try
		{
			archiveId = (Long)session.save(archive);
			
			transaction.commit();
		}
		catch (Exception error)
		{
			transaction.rollback();
			
			logger.error(error.getMessage(), error);
		}
		finally
		{
			if (session != null && session.isOpen())
			{
				session.close();
			}
		}
		
		return archiveId > 0 ? true : false;
	}
	
	/**
	 * 아카이브 아이디에 상응하는 아카이브 인스턴스를 데이터베이스에서 가져온다.
	 * @param archiveId 가져오려는 아카이브의 아카이브 아이디를 나타낸다.
	 * @return 요청한 아카이브의 인스턴스를 나타낸다. NULL 일 수 있다.
	 */
	public Archive getArchive(long archiveId)
	{
		Archive archive = null;
		
		try
		{
			Session session = this._sessionFactory.openSession();
			
			archive = (Archive)session.get(Archive.class, archiveId);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return archive;
	}
}